Un outil Shiny pour explorer les bases de données et les tables parquet
14/05/2025
Un package R qui lance une application Shiny qui a plusieurs objectifs :
=> Un package développé et maintenu par Adam Marsal du SSM Justice.
# install.packages("remotes")
remotes::install_git("https://gitlab.forge.agriculture.rie.gouv.fr/ssp/bmis/packages/dbexplorer",
dependencies = T,
git = "external")Comme n’importe quel autre package R, {dbExplorer} doit être chargé avec :
Avant d’explorer ce package, 2 concepts théoriques sont nécessaires.
Les “Background Jobs” dans RStudio sont une fonctionnalité qui permet d’exécuter des scripts R en arrière-plan sans bloquer l’interface principale de RStudio.
Quelques caractéristiques :
Soit le script simple suivant :
library(dplyr)
Sys.sleep(5)
tab_agregee <- iris |>
summarise(Moy_pet_long = mean(Petal.Length, na.rm = TRUE), .by = Species)
Sys.sleep(5)
print("Pgm terminé")Ce script peut être lancé via un background job en cliquant sur le bouton "Start Background job".
La fenêtre suivante s’affiche :
En fonction des choix effectués au lancement du background job, les résultats seront (ou pas) disponibles dans l’environnement global de la session R.
Si vous avez choisi de stocker les résultats dans un objet “results”, voici comment y accéder :
Les bases de données relationnelles sont structurées de manière hiérarchique et logique.
Exemple de structure :
Base de données : vente_en_ligne
│
├── Schéma : public
│ ├── Table : clients
│ ├── Table : commandes
│ └── Table : produits
│
└── Schéma : archive
└── Table : commandes_2020
Exemple avec BDD PostgreSQL :
library(connections)
library(RPostgres)
### Chargement des infos de connection
infos_connection_prod <- read_delim("infos_connection.csv",
delim = ";", escape_double = FALSE, trim_ws = TRUE,
show_col_types = FALSE) %>%
filter(ENV == "PROD")
### Connexion à la BDD
con <- connection_open(
Postgres(),
user = infos_connection_prod[["USER"]],
password = rawToChar(openssl::base64_decode(infos_connection_prod[["PWD"]])),
host = infos_connection_prod[["DB_URL"]],
dbname = infos_connection_prod[["DATABASE"]],
port = infos_connection_prod[["PORT"]])=> La structure de la BDD est visible dans l’onglet "Connections" de RStudio :
## Installation du package
remotes::install_git("https://gitlab.forge.agriculture.rie.gouv.fr/ssp/bmis/packages/dbexplorer",
dependencies = T,
git = "external")## Création du fichier de connexion à postgre SQL
connector_file <- "./R/dbExplorer-connector/dbExplorerPgConnector.R"
dbExplorer:::createPostgreSQLConnector(host = "postgresql-164525.projet-sortie-sas",
dbname = "dvf",
port = 5432,
file=connector_file)## Lancement de l'application sur ce fichier de connexion.
ExplorerDonnees(connectorFile = connector_file)=> Un “background job” se lance dans RStudio et une application shiny s’ouvre dans le navigateur.
Entrer le login & mot de passe d’accès à la BDD :
On peut aussi supprimer la fenêtre de login en modifiant le fichier dbExplorerPgConnector.R.
Démo sur Cerise ! (voir rép. dbExplorer_test)
### Connexion à la BDD
con <- connection_open(
Postgres(),
user = infos_connection_prod[["USER"]],
password = rawToChar(openssl::base64_decode(infos_connection_prod[["PWD"]])),
host = infos_connection_prod[["DB_URL"]],
dbname = infos_connection_prod[["DATABASE"]],
port = infos_connection_prod[["PORT"]])Appel de la fonction exportPgToParquet.R :
# Export de la table categorie_juridique
exportPgToParquet(con,"categorie_juridique")
# Export de la table entite_surface
exportPgToParquet(con,"entite_surface")
library(RSQLite)
connector_file <- "R/dbExplorer-connector/connector_sqlite.R"
dbExplorer::ExplorerDonnees(connectorFile = "R/dbExplorer-connector/connector_sqlite.R")dbExplorer::ExplorerDossiers("~/CERISE/03-Espace-de-Diffusion/030_Structures_exploitations/3020_Recensements/RA_2010/")Prenons une base SQLite :
library(RSQLite)
chemin_IPPAP_dev <- "~/CERISE/02-Espace-de-Production/090_Prix/9010_IPPAP/IPPAP_app/dev/App/donnees/IPPAP.sqlite"
db_IPPAP <- dbConnect(RSQLite::SQLite(), dbname = chemin_IPPAP_dev)Quelques manipulations possibles avec des fonctions R :
dbListFields(db_IPPAP,"PRIX")
> [1] "CODE_S" "2019-01-01" "2019-02-01" "2019-03-01" "2019-04-01" "2019-05-01"
[7] "2019-06-01" "2019-07-01" "2019-08-01" "2019-09-01" "2019-10-01" "2019-11-01"
[13] "2019-12-01" "2020-01-01" "2020-02-01" "2020-03-01" "2020-04-01" "2020-05-01"
[19] "2020-06-01" "2020-07-01" "2020-08-01" "2020-09-01" "2020-10-01" "2020-11-01"
...Installation et chargement :
Création d’un objet dm :
── Table source ───────────────────────────────────────────────────────────────────────────
src: sqlite 3.47.1 [/var/data/nfs/CERISE/02-Espace-de-Production/090_Prix/9010_IPPAP/IPPAP_app/dev/App/donnees/IPPAP.sqlite]
── Metadata ───────────────────────────────────────────────────────────────────────────────
Tables: `COEFF_RACCORDEMENT`, `DATES`, `NOMENCLATURE_BDC`, `POND_MOIS_COMPOSANTS`, `PRIX`, … (8 total)
Columns: 511
Primary keys: 0
Foreign keys: 0names(fin_dm)
> [1] "COEFF_RACCORDEMENT" "DATES" "NOMENCLATURE_BDC"
[4] "POND_MOIS_COMPOSANTS" "PRIX" "QUANTITES"
[7] "REFERENTIEL_IPPAP" "VIVANTES" fin_dm$PRIX
# Source: table<`PRIX`> [?? x 121]
# Database: sqlite 3.47.1 [/var/data/nfs/CERISE/02-Espace-de-Production/090_Prix/9010_IPPAP/IPPAP_app/dev/App/donnees/IPPAP.sqlite]
CODE_S `2019-01-01` `2019-02-01` `2019-03-01` `2019-04-01` `2019-05-01` `2019-06-01` `2019-07-01` `2019-08-01`
<chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 10100046 1.84 1.79 1.7 1.73 1.75 NA NA NA
2 1120057 NA NA 0.606 0.516 0.504 0.531 0.75 0.657
3 1140001 NA NA NA NA 0.162 0.295 0.208 0.203colnames(fin_dm$PRIX)
> [1] "CODE_S" "2019-01-01" "2019-02-01" "2019-03-01" "2019-04-01" "2019-05-01"
[7] "2019-06-01" "2019-07-01" "2019-08-01" "2019-09-01" "2019-10-01" "2019-11-01"
[13] "2019-12-01" "2020-01-01" "2020-02-01" "2020-03-01" "2020-04-01" "2020-05-01"
[19] "2020-06-01" "2020-07-01" "2020-08-01" "2020-09-01" "2020-10-01" "2020-11-01"
...dplyr::count(fin_dm$REFERENTIEL_IPPAP,LIB_PRODUIT)
# Source: SQL [?? x 2]
# Database: sqlite 3.47.1 [/var/data/nfs/CERISE/02-Espace-de-Production/090_Prix/9010_IPPAP/IPPAP_app/dev/App/donnees/IPPAP.sqlite]
LIB_PRODUIT n
<chr> <int>
1 Abricot 12
2 Ail 1
3 Artichaut 7
# ℹ more rows
# ℹ Use `print(n = ...)` to see more rowsExemple issu de la documentation avec dm_draw()…
… qui permet de visualiser les relations entre les tables :
Le package {dm} est très riche ! D’autres fonctionnalités pourront être abordés lors d’un futur GUR !